/*
** $ 身份：嘞做.h $
** 炉啊的栈和调用结构
** 请参见 炉啊.h中的版权声明
*
* 本人所用声母表: a啊 b哔 c西 d迪 e鹅 f弗 g哥 
* h喝 i艾 j鸡 k颗 l嘞 m摸 n恩
* o欧 p匹 q气 r日 s丝 t嚏 
* u由 v微 w屋 x斯 y医 z只
*
* 一些英文单词缩写,我的翻译大多来自;有道词典,谷歌翻译,百度.
* 一些术语实在不好翻译,所以就原封不动.
* 
* 
*/

#ifndef 嘞做_喝
#define 嘞做_喝


#include "嘞对象.h"
#include "嘞国.h"
#include "嘞只入出.h"

/*
** 宏以检查栈大小并在需要时增长栈. 参数
**  '预先' / '销售点'  允许宏将指针保留到
** 跨重新分配栈，仅在需要时才进行工作。
**  '条件移栈'  用于大量测试，以强制重新分配栈
** 每次检查。
*/
#define 炉啊迪_检查栈辅(嘞,恩,预先,销售点)  \
	if (嘞->栈_最后 - 嘞->顶部 <= (恩)) \
	  { 预先; 炉啊迪_增长栈(嘞, 恩, 1); 销售点; } \
        else { 条件移栈(嘞,预先,销售点); }

/* 通常,  "预先"/"销售点" 为空 (无需保存)  */
#define 炉啊迪_检查栈(嘞,恩)	炉啊迪_检查栈辅(嘞,恩,(void)0,(void)0)

#define 保存栈(嘞,匹)		((char *)(匹) - (char *)嘞->栈)
#define 恢复栈(嘞,恩)	((丝嚏颗身份)((char *)嘞->栈 + (恩)))

/* 宏检查栈大小, 保全 '匹' */
#define 检查栈匹(嘞,恩,匹)  \
  炉啊迪_检查栈辅(嘞, 恩, \
    ptrdiff_t 嚏__ = 保存栈(嘞, 匹);  /* 保存 '匹' */ \
    炉啊西_检查垃圾回收(嘞),  /* 栈增长用的内存 */ \
    匹 = 恢复栈(嘞, 嚏__))  /* '销售点' 部分: 恢复 '匹' */

/* 宏检查栈大小和 垃圾回收 */
#define 检查栈垃圾回收(嘞,弗大小)  \
	炉啊迪_检查栈辅(嘞, (弗大小), (void)0, 炉啊西_检查垃圾回收(嘞))

/* 受保护函数的类型, 由 '跑保护' 运行 */
typedef void (*匹函) (炉啊_国 *嘞, void *由迪);

炉啊艾_函 void 炉啊迪_设置错误对象 (炉啊_国 *嘞, int 错误代码, 丝嚏颗身份 老顶部);
炉啊艾_函 int 炉啊迪_保护解析 (炉啊_国 *嘞, 只入出 *只, const char *名字,
                                                  const char *模式);
炉啊艾_函 void 炉啊迪_钩子 (炉啊_国 *嘞, int 事件, int 行,
                                        int 弗转移, int 恩转移);
炉啊艾_函 void 炉啊迪_钩子调用 (炉啊_国 *嘞, 调用信息 *调信);
炉啊艾_函 void 炉啊迪_预先尾部调用 (炉啊_国 *嘞, 调用信息 *调信, 丝嚏颗身份 函, int 恩);
炉啊艾_函 void 炉啊迪_调用 (炉啊_国 *嘞, 丝嚏颗身份 函, int 恩结果);
炉啊艾_函 void 炉啊迪_调用不产出 (炉啊_国 *嘞, 丝嚏颗身份 函, int 恩结果);
炉啊艾_函 void 炉啊迪_尝试函标签方法 (炉啊_国 *嘞, 丝嚏颗身份 函);
炉啊艾_函 int 炉啊迪_匹调用 (炉啊_国 *嘞, 匹函 函, void *由,
                                        ptrdiff_t 老顶部, ptrdiff_t 鹅弗);
炉啊艾_函 void 炉啊迪_销售点调用 (炉啊_国 *嘞, 调用信息 *调信, int 恩返);
炉啊艾_函 int 炉啊迪_重新分配栈 (炉啊_国 *嘞, int 新大小, int 提高错误);
炉啊艾_函 int 炉啊迪_增长栈 (炉啊_国 *嘞, int 恩, int 提高错误);
炉啊艾_函 void 炉啊迪_收缩栈 (炉啊_国 *嘞);
炉啊艾_函 void 炉啊迪_加一顶部 (炉啊_国 *嘞);

炉啊艾_函 嘞_不返 炉啊迪_抛出 (炉啊_国 *嘞, int 错误代码);
炉啊艾_函 int 炉啊迪_原始跑保护 (炉啊_国 *嘞, 匹函 弗, void *由迪);

#endif